package com.zpkj.portal.utils.des3;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

/**
 * des加密解密
 * 
 * @author
 * 
 */
public class Des3H5 {

	Key key;

	public Des3H5(String str) {
		setKey(str);// 生成密匙
	}

	public Des3H5() {
		setKey("1379246805559731246875312468");
	}

	/**
	 * 根据参数生成KEY
	 */
	public void setKey(String strKey) {
		try {
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			this.key = keyFactory.generateSecret(new DESKeySpec(strKey.getBytes("UTF8")));
		} catch (Exception e) {
			throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
		}
	}

	/**
	 * 加密String明文输入,String密文输出
	 */
	@SuppressWarnings("restriction")
	public String encrypt(String strMing) {
		byte[] byteMi = null;
		byte[] byteMing = null;
		String strMi = "";
		BASE64Encoder base64en = new BASE64Encoder();
		try {
			byteMing = strMing.getBytes("UTF8");
			byteMi = this.getEncCode(byteMing);
			strMi = base64en.encode(byteMi);
		} catch (Exception e) {
			throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
		} finally {
			base64en = null;
			byteMing = null;
			byteMi = null;
		}
		return strMi;
	}

	/**
	 * 解密 以String密文输入,String明文输出
	 * 
	 * @param strMi
	 * @return
	 */
	@SuppressWarnings("restriction")
	public String decrypt(String strMi) {
		BASE64Decoder base64De = new BASE64Decoder();
		byte[] byteMing = null;
		byte[] byteMi = null;
		String strMing = "";
		try {
			byteMi = base64De.decodeBuffer(strMi);
			byteMing = this.getDesCode(byteMi);
			strMing = new String(byteMing, "UTF8");
		} catch (Exception e) {
			throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
		} finally {
			base64De = null;
			byteMing = null;
			byteMi = null;
		}
		return strMing;
	}

	/**
	 * 加密以byte[]明文输入,byte[]密文输出
	 * 
	 * @param byteS
	 * @return
	 */
	private byte[] getEncCode(byte[] byteS) {
		byte[] byteFina = null;
		Cipher cipher;
		try {
			cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.ENCRYPT_MODE, key, SecureRandom.getInstance("SHA1PRNG"));
			byteFina = cipher.doFinal(byteS);
		} catch (Exception e) {
			throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
		} finally {
			cipher = null;
		}
		return byteFina;
	}

	/**
	 * 解密以byte[]密文输入,以byte[]明文输出
	 * 
	 * @param byteD
	 * @return
	 */
	private byte[] getDesCode(byte[] byteD) {
		Cipher cipher;
		byte[] byteFina = null;
		try {
			cipher = Cipher.getInstance("DES");
			cipher.init(Cipher.DECRYPT_MODE, key, SecureRandom.getInstance("SHA1PRNG"));
			byteFina = cipher.doFinal(byteD);
		} catch (Exception e) {
			throw new RuntimeException("Error initializing SqlMap class. Cause: " + e);
		} finally {
			cipher = null;
		}
		return byteFina;
	}

//	public static void main(String args[]) {
//		Des3H5 des = new Des3H5();
//
//		String str1 = "1234";
//		// DES加密
//		String str2 = des.encrypt(str1);
//		Des3H5 des1 = new Des3H5();
//		String deStr = des1.decrypt("LitSU9m4tntFVzmtxt9zpkhb+sVkzij4thurGa4QV8gQ9CnUyJle/n5LtPK9PnGKmuN6pSVZUYUl9gUAYYaEQs+IafpnU26Dxl9UI4oFCEZxpBNbBixU346GfDWe8aZsv84iaaWITKXHMr9+U9ZJ13XsDnQAXpLg/s9+/rOP1zGQzd8sW4FFMIpWkF331qkRJIAy1ARGqQrsBCrLTh7GuUhQd2BHx7+fO9p4p0k8cdFA1hwZxGiPUa0Kf1On8ttEAzXoGSqnHHRA5FJiqgdkx6OQknxpKOSntD3bLzG5YUbguAiWhAY7dCi/12t3MT9g");
//		System.out.println("密文:" + str2);
//		// DES解密
//		System.out.println("明文:" + deStr);
//
//	}

}